package top.lishuoboy.shiro02_springboot_jsp.mapper;

import cn.hutool.core.bean.BeanUtil;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

/**
 * 万能 sql 执行器
 * 单表优先用BaseMapper<T>、BaseService<T>; 多表，DDL等用 SqlMapper
 * 与mybatis中的不同是 select返回的是Long，不是Integer
 */
@Repository
public interface SqlMapper {

    /** select 一张表 */
    @Select("${sql}")
    <V> List<Map<String, V>> selectTable(String sql);

    /** get 一张表。封装 selectTable，将 mapList 转 beanList，自动下划线转驼峰 */
    default <T> List<T> getTable(String sql, Class<T> tClass) {
        return BeanUtil.copyToList(this.selectTable(sql), tClass);
    }

    /** select 一行，查到多行会报错 */
    @Select("${sql}")
    <V> Map<String, V> selectOneRow(String sql);

    /** get 一行，查到多行会报错。封装 selectOneRow，将 map 转 bean，自动下划线转驼峰 */
    default <T> T getOneRow(String sql, Class<T> tClass) {
        return BeanUtil.toBean(this.selectOneRow(sql), tClass);
    }

    /** select 一列，查多列返回第一列 */
    @Select("${sql}")
    <E> List<E> selectOneColumn(String sql);

    /** select 一个值，查到多行会报错，查多列返回第一列，select count() 返回值为 Long */
    @Select("${sql}")
    <E> E selectOneVal(String sql);

    /* 执行 insert update delete 和 DDL */
    @Update("${sql}")
    Integer executeUpdate(String sql);
}